//!
//! Copyright (c) 2024-2999 北京心月狐科技有限公司 All rights reserved.
//!
//! https://www.mxxshop.com
//!
//! Licensed 并不是自由软件，未经许可不能去掉 MxxShop 相关版权
//!
//! 版权所有，侵权必究！
//!

use actix_session::Session;
use actix_web::{HttpRequest};
use crate::core::constant::user_const::SESSION_USER_KEY;
use crate::core::permission::jwt_util::JWTToken;
use crate::core::errors::error::WhoUnfollowedError;
use crate::modules::user::entity::user_model::{UserInfoVO, UserLoginSession};
use crate::modules::user::service::user_service;
use crate::utils::settings::Settings;

pub fn get_user(req: HttpRequest) -> Result<JWTToken, WhoUnfollowedError> {
    let token = req
        .headers()
        .get("Authorization")
        .map(|v| v.to_str().unwrap_or_default().to_string())
        .unwrap_or_default()
        .split("Bearer ")
        .collect::<Vec<&str>>()
        .pop()
        .unwrap_or_default()
        .to_string();
    let setting = Settings::get();
    let jwt_token = JWTToken::verify(&setting.server.jwt_secret, &token)?;
    Ok(jwt_token)
}

pub async fn get_user_info(session: Session) -> Option<UserInfoVO> {
    // 尝试从 session 中获取用户信息
    match session.get::<String>(SESSION_USER_KEY) {
        Ok(Some(user)) => {
            // 尝试解析 JSON 字符串
            match serde_json::from_str::<UserLoginSession>(&user) {
                Ok(person) => {
                    let user = user_service::get_by_id(&person.id).await.unwrap_or_default();
                    Some(UserInfoVO::from(user.unwrap_or_default()))
                },
                Err(_e) => {
                    None // 解析失败，返回 None
                }
            }
        }
        Ok(None) => {
            None
        }
        Err(_e) => {
            None // 获取 session 时出错，返回 None
        }
    }
}

/// 获取用户id
pub fn get_user_id(session: Session) -> Option<u64> {
    // 尝试从 session 中获取用户信息
    match session.get::<String>(SESSION_USER_KEY) {
        Ok(Some(user)) => {
            // 尝试解析 JSON 字符串
            match serde_json::from_str::<UserLoginSession>(&user) {
                Ok(person) => {
                    person.id
                }, // 返回解析后的结构体
                Err(_e) => {
                    None // 解析失败，返回 None
                }
            }
        }
        Ok(None) => {
            None
        }
        Err(_e) => {
            None
        }
    }
}

/// 获取用户账户
pub fn get_user_name(session: Session) -> Option<String> {
    // 尝试从 session 中获取用户信息
    match session.get::<String>(SESSION_USER_KEY) {
        Ok(Some(user)) => {
            // 尝试解析 JSON 字符串
            match serde_json::from_str::<UserLoginSession>(&user) {
                Ok(person) => {
                    person.username
                }, // 返回解析后的结构体
                Err(_e) => {
                    None // 解析失败，返回 None
                }
            }
        }
        Ok(None) => {
            None
        }
        Err(_e) => {
            None
        }
    }
}